package jdbc.datasource;

import jdbc.utils.JDBCUtils;
import org.junit.jupiter.api.Test;

import java.sql.Connection;

/**
 * @author DCSGO
 * @version 1.0
 * 大量连接数据库的相关问题
 */
public class ConQuestion {
    @Test
    public void conTest() {
        //1.连接数据库不断开连接
        //抛异常：message from server: "Too many connections"
        //2.连接数据库并断开
        //非常耗时
        System.out.println("开始连接数据库...");
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection = JDBCUtils.getConnection();
            //do something...
            JDBCUtils.close(null, null, connection);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时：" + (end - start));
        //开始连接数据库...
        //耗时：9442
    }
    /*
    传统获取Connection问题分析
    1.传统的JDBC数据库连接使用 DriverManager 来获取，每次向数据库建立
      连接的时候都要将Connection加载到内存中，再险证IP地址，用户名和密码(0.05s~1s时间)
      需要数据库连接的时候，就向数据库请求一个，频繁的进行数据库连接操作将占用很多的系统资源
      容易造成服务器崩溃。
    2.每一次数据库连接，使用完后都得断开，如果程序出现异常而未能关闭，将导致数据库内存泄漏，最终将导致重启数据库。
    3.传统获取连接的方式不能控制创建的连接数量，如连接过多，也可能导致内存泄漏，MySQL崩溃。
    4.解决传统开发中的数据库连接问题，可以采用数据库连接池技术(connection pool)。
     */
}
